package jvmTest;

import java.util.ArrayList;
import java.util.List;

/** VM Args:
 * //这两个参数保证了堆中的可分配内存固定为20M -Xms20m -Xmx20m
 * //生成dump文件 -XX:+HeapDumpOnOutOfMemoryError
 * //文件生成的位置，作则生成在桌面的一个目录 -XX:HeapDumpPath=C:\Users\83654\Desktop
 *
 * 其他方式获取：
 * 使用 jmap 命令生成 dump 文件
 * jmap -dump:live,format=b,file=d:\dump\heap.hprof <pid>
 *
 * 使用 jcmd 命令生成 dump 文件
 * jcmd <pid> GC.heap_dump d:\dump\heap.hprof
 *
 * 注意：JVM 生成 Heap Dump 的时候，虚拟机是暂停一切服务的。如果是线上系统执行 Heap Dump 时需要注意。
 * */
public class HeapOOM {
    //创建一个内部类用于创建对象使用
    static class OOMObject {
    }
    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<OOMObject>();
        //无限创建对象，在堆中
        while (true) {
            list.add(new OOMObject());
        }
    }

    /**
     * 最终控制台结果
     * java.lang.OutOfMemoryError: Java heap space
     * Dumping heap to C:\Users\83654\Desktop\java_pid13644.hprof ...
     * Heap dump file created [28607631 bytes in 0.097 secs]
     * Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
     * 	at java.util.Arrays.copyOf(Arrays.java:3210)
     * 	at java.util.Arrays.copyOf(Arrays.java:3181)
     * 	at java.util.ArrayList.grow(ArrayList.java:261)
     * 	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
     * 	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
     * 	at java.util.ArrayList.add(ArrayList.java:458)
     * 	at jvmTest.HeapOOM.main(HeapOOM.java:19)
     * */
}
